#ifndef BIN2OBJ_JSON_PARSER_H_
#define BIN2OBJ_JSON_PARSER_H_

#include <iostream>
#include <cstring>
#include <vector>

struct JsonMetadata
{
    double FormatVersion;    // `json:"formatVersion"`
    std::string SourceFile;  // `json:"sourceFile"`
    std::string GeneratedBy; // `json:"generatedBy"`
    int Vertices;            // `json:"vertices"`
    int Faces;               // `json:"faces"`
    int Normals;             // `json:"normals"`
    int UVs;                 // `json:"uvs"`
    int Materials;           // `json:"materials"`
};

struct JsonMaterial
{
    int DbgColor;                  // `json:"DbgColor"`
    int DbgIndex;                  // `json:"DbgIndex"`
    std::string DbgName;           // `json:"DbgName"`
    double ColorAmbient[3];        // `json:"colorAmbient"`
    double ColorDiffuse[3];        // `json:"colorDiffuse"`
    double ColorSpecular[3];       // `json:"colorSpecular"`
    double Illumination;           // `json:"illumination"`
    std::string Shading;           // `json:"shading"`
    int DoubleSided;               // `json:"doubleSided"`
    std::string MapAlpha;          // `json:"mapAlpha"`
    std::string MapDiffuseWrap[2]; // `json:"mapDiffuseWrap"`
    double AlphaTest;              // `json:"alphaTest"`
    std::string MapDiffuse;        // `json:"mapDiffuse"`
    double OpticalDensity;         // `json:"opticalDensity"`
    double SpecularCoef;           // `json:"specularCoef"`
};

struct JsonAnchor
{
    double Normal[3];   // `json:"normal"`
    double Center[3];   // `json:"center"`
    double Unit;        // `json:"unit"`
    std::string Name;   // `json:"name"`
    std::string NameZh; // `json:"name_zh"`
};

struct JsonTopology
{
    double Scale;                    // `json:"scale"`
    double Rotation[4];              // `json:"rotation"`
    int AnchorCount;                 // `json:"anchorcount"`
    std::vector<JsonAnchor> Anchors; // `json:"anchors"`
    double Offset[3];                // `json:"offset"`
};

struct JsonFile
{
    JsonMetadata Metadata;               // `json:"metadata"`
    std::vector<JsonMaterial> Materials; // `json:"materials"`
    std::string Buffers;                 // `json:"buffers"`
    JsonTopology Topology;               // `json:"topology"`
};

JsonFile parseBinJson(std::string data);
JsonFile parseBinJsonFile(std::string path);
#endif